dhcpv6: fix NA/PD=try when NA/PD aren't provided master
authorÁlvaro Fernández Rojas <[email protected]>
Tue, 16 Dec 2025 12:30:49 +0000 (13:30 +0100)
committerÁlvaro Fernández Rojas <[email protected]>
Wed, 17 Dec 2025 13:56:15 +0000 (14:56 +0100)
Fixes infinite SOLICIT loop when NA=try and/or PD=try but the ISP provides
no NA and/or no PD (only SLAAC).

Closes: https://github.com/openwrt/odhcp6c/issues/134
Link: https://github.com/openwrt/odhcp6c/pull/137
Signed-off-by: Álvaro Fernández Rojas <[email protected]>
src/dhcpv6.c

index 32a5e47df99e9f4c5ed0bb260a3fc8d298b4638f..d8bb8be6a08b06689896d20961d385cf9881b3d4 100644 (file)
@@ -2064,12 +2064,25 @@ int dhcpv6_promote_server_cand(void)
        if (!cand_len)
                return -1;
 
-       if (!cand->ia_pd_len && cand->has_noaddravail && na_mode == IA_MODE_TRY) {
-               na_mode = IA_MODE_NONE;
+       if (!cand->ia_pd_len && cand->has_noaddravail) {
+               bool override = false;
 
-               dhcpv6_retx[DHCPV6_MSG_SOLICIT].max_timeo = cand->sol_max_rt;
-               dhcpv6_retx[DHCPV6_MSG_INFO_REQ].max_timeo = cand->inf_max_rt;
-               return -1;
+               if (na_mode == IA_MODE_TRY) {
+                       na_mode = IA_MODE_NONE;
+                       override = true;
+               }
+
+               if (pd_mode == IA_MODE_TRY) {
+                       pd_mode = IA_MODE_NONE;
+                       override = true;
+               }
+
+               if (override) {
+                       dhcpv6_retx[DHCPV6_MSG_SOLICIT].max_timeo = cand->sol_max_rt;
+                       dhcpv6_retx[DHCPV6_MSG_INFO_REQ].max_timeo = cand->inf_max_rt;
+
+                       return -1;
+               }
        }
 
        hdr[0] = htons(DHCPV6_OPT_SERVERID);